# -.- coding: utf-8 -.-

from django.shortcuts import render_to_response
from fichas.models import *
from models import *
from django.template import RequestContext
from django.contrib.auth.decorators import login_required
from django.http import HttpResponseRedirect
from django.core.urlresolvers import reverse
from forms import PartidaForm, DescripcionForm
from django.contrib.auth.models import User

@login_required
def nueva_partida(request, extra_context={}, template_name='partidas/formulario_partida.html'):
    if request.method == 'POST':
        form = PartidaForm(propietario=request.user.username,data=request.POST)
        if form.is_valid():
            id = form.save()
            return HttpResponseRedirect(reverse(viewname='ver_partida', args=[id]))
    else:
        form = PartidaForm(propietario=request.user.username)
    extra_context['form'] = form
    return render_to_response(template_name, extra_context, context_instance=RequestContext(request))

@login_required
def ver_partida(request, parti, extra_context={}, template_name='partidas/ver_partida.html'):
    try:
        extra_context['partida'] = Partida.objects.get(id=parti)
        extra_context['participantes'] = FichaAnima.objects.filter(partida=extra_context['partida']).distinct()
    except Partida.DoesNotExist:
        pass
    
    return render_to_response(template_name, extra_context, context_instance=RequestContext(request))
    
@login_required
def modificar_partida(request, parti, extra_context={}, template_name='partidas/modificar_partida.html'):
    try:
        usuario = User.objects.get(username=request.user.username)
        master = Jugador.objects.get(jugador=usuario)
        extra_context['partida'] = Partida.objects.get(id=parti,master=master)
        extra_context['participantes'] = FichaAnima.objects.filter(partida=extra_context['partida']).distinct()
    except Partida.DoesNotExist:    #medio de seguridad para evitar que se acceda por url
        print "ALERTA: INTENTANDO ACCEDER A UNA PARTIDA QUE NO LE PERTENECE"
        return HttpResponseRedirect(reverse(viewname='inicio'))
    
    return render_to_response(template_name, extra_context, context_instance=RequestContext(request))

@login_required
def modificar_descripcion(request, parti, extra_context={}, template_name='partidas/formulario_partida.html'):
    if request.method == 'POST':
        form = DescripcionForm(propietario=request.user.username,partida=parti,data=request.POST)
        if form.is_valid():
            id = form.save()
            return HttpResponseRedirect(reverse(viewname='modificar_partida', args=[id]))
    else:
        try:
            diccionario = {}
            usuario = User.objects.get(username=request.user.username)
            master = Jugador.objects.get(jugador=usuario)
            partida = Partida.objects.get(id=parti,master=master)
            diccionario['descripcion'] = partida.descripcion
            form = DescripcionForm(propietario=request.user.username,partida=parti,initial=diccionario)
        except Partida.DoesNotExist:    #medio de seguridad para evitar que se acceda por url
            print "ALERTA: INTENTANDO ACCEDER A UNA PARTIDA QUE NO LE PERTENECE"
            return HttpResponseRedirect(reverse(viewname='inicio'))
        except:
            print "ERROR: FALLO EN FUNCION MODIFICAR DESCRIPCION. MODULO PARTIDAS"
    extra_context['form'] = form
    return render_to_response(template_name, extra_context, context_instance=RequestContext(request))

@login_required
def borrar_partida(request, parti, extra_context={}, template_name='inicial.html'):
    try:
        jug = Jugador.objects.get(jugador=request.user)
        borrar = Partida.objects.get(master=jug, id=parti)
        Partida.delete(borrar)
    except Partida.DoesNotExist:
        pass

    return render_to_response(template_name,extra_context, context_instance=RequestContext(request))

@login_required
def incluir_jugador(request, parti, extra_context={}, template_name='partidas/lista_jugadores.html'):
    #Todos los jugadores QUE NO SEAN NI el propio jugador NI aquellos jugadores que no deseen participar en partidas
    lapartida = Partida.objects.get(id=parti)
    extra_context['listajugadores'] = Jugador.objects.filter(participativo=True).exclude(jugador=lapartida.master.jugador)
    extra_context['partida_id'] = parti
    return render_to_response(template_name, extra_context, context_instance=RequestContext(request))

@login_required
def listar_fichas(request, parti, jugador, extra_context={}, template_name='partidas/lista_fichas.html'):
    #TODO: Poner la opcion "incluir en partida" al lado de cada ficha si ninguna ha sido previamente seleccionada para jugar
    #En ese caso, se pone solo la seleccionada como "Incluida" y no se deja asignar ninguna otra hasta quitar esa ^^
    usuario = User.objects.get(username=jugador)
    jugador_convocado = Jugador.objects.get(jugador=usuario)
    
    try:    #medio de seguridad para evitar que se acceda por url
        master = User.objects.get(username=request.user.username)
        master = Jugador.objects.get(jugador=master)
        extra_context['partida'] = Partida.objects.get(id=parti,master=master)
    except Partida.DoesNotExist:
        print "ALERTA: INTENTANDO ACCEDER A UNA PARTIDA QUE NO LE PERTENECE"
        return HttpResponseRedirect(reverse(viewname='inicio'))
    extra_context['jugador_nominado'] = jugador_convocado
    extra_context['listafichas_nominado'] = FichaAnima.objects.filter(propietario=jugador_convocado, partida=None)
    
    try:
        extra_context['escogida_nominado'] = FichaAnima.objects.get(propietario=jugador_convocado, partida=extra_context['partida'])
    except FichaAnima.DoesNotExist:
        extra_context['escogida_nominado'] = None
    #extra_context['listafichas'] = FichaAnima.objects.filter(Q(propietario=jugador_convocado, partida=None) & Q(propietario=jugador_convocado, partida=extra_context['partida']))
    
    return render_to_response(template_name, extra_context, context_instance=RequestContext(request))

@login_required
def incluir_ficha(request, parti, jugador, personaje, extra_context={}, template_name='partidas/lista_fichas.html'):
    #TODO: en esta funcion: se envia un mensaje al jugador cuya ficha quiere incluir el master en el juego
    #en el caso de que el jugador acepte jugar la partida, se establecen las caracteristicas en la ficha (se indica a que partida pertenece la ficha)
    usuario = User.objects.get(username=jugador)
    jugador_convocado = Jugador.objects.get(jugador=usuario)
    try:    #medio de seguridad para evitar que se acceda por url
        master = User.objects.get(username=request.user.username)
        master = Jugador.objects.get(jugador=master)
        partida_a_jugar = Partida.objects.get(id=parti,master=master)
    except Partida.DoesNotExist:
        print "ALERTA: INTENTANDO ACCEDER A UNA PARTIDA QUE NO LE PERTENECE"
        return HttpResponseRedirect(reverse(viewname='inicio'))
    try:    #probamos a que la ficha no tenga ninguna otra partida asignada
        ficha = FichaAnima.objects.get(propietario=jugador_convocado, personaje=personaje, partida=None)
        #comprobamos que no haya ninguna otra ficha del mismo jugador previamente asignada a la misma partida
        try:
            ficha_previa = FichaAnima.objects.get(propietario=jugador_convocado, partida=partida_a_jugar)
            #si ya existia una, la quitamos
            ficha_previa.partida = None
            ficha_previa.save()
        except FichaAnima.DoesNotExist:
            pass
        #ya la podemos poner como asignada y devolver info
        ficha.partida = partida_a_jugar
        ficha.save()
    except FichaAnima.DoesNotExist:
        pass
    return HttpResponseRedirect(reverse(viewname='listar_fichas', args=[parti,jugador]))
    
    #TODO: en un futuro, al añadir la funcionalidad de "ficha visible/privada" comprobar que si es privada no deberia poderse
    #asignar a una partida o al menos no sin un consentimiento explicito

@login_required
def quitar_ficha(request, parti, jugador, personaje, extra_context={}, template_name='partidas/lista_fichas.html'):
    usuario = User.objects.get(username=jugador)
    jugador_convocado = Jugador.objects.get(jugador=usuario)
    
    try:    #medio de seguridad para evitar que se acceda por url
        master = User.objects.get(username=request.user.username)
        master = Jugador.objects.get(jugador=master)
        partida_a_jugar = Partida.objects.get(id=parti,master=master)
    except Partida.DoesNotExist:
        print "ALERTA: INTENTANDO ACCEDER A UNA PARTIDA QUE NO LE PERTENECE"
        return HttpResponseRedirect(reverse(viewname='inicio'))
    
    try:
        ficha = FichaAnima.objects.get(propietario=jugador_convocado, personaje=personaje, partida=partida_a_jugar)
        ficha.partida = None
        ficha.save()
    except FichaAnima.DoesNotExist:
        pass
    return HttpResponseRedirect(reverse(viewname='listar_fichas', args=[parti,jugador]))
